草庐IT

linux - 在bash中每n个命令执行一次函数

我想制作一个程序,在bash中每n个命令执行一次。例如,我希望用户在bash中每5个命令回答一个问题。我认为这个功能可以只使用bash脚本来实现,因为我找不到合适的解决方案。我不想编译新的bash,我认为这可以通过bash脚本来完成。如果是这样,我必须更改bashrc吗? 最佳答案 您可以使用自定义函数在shell中捕获DEBUG信号。runcmd(){if((n==5));thenn=0;pwd;else((n++));fi;}trap'runcmd'DEBUG使用自定义命令或脚本更改pwd。trap'handler'DEBUG在

linux - 使用 for 循环 seq 分配动态 bash 变量名

所以我正在尝试做一些事情,不确定是否可行。我有以下代码:foriin{0..5};doif[[-f./user$i]];thengroup$i=$(grep-w"group"./user0|awk'{print$2}'|perl-lape's/\s+//sg')我想要做的是为{0..5}的每个实例分配一个唯一的变量,因此group1group2group3group4为每个变量名称。然后我会将./user0更改为./user$i并根据我的顺序创建一个动态变量列表。这可能吗?尝试执行此操作时出现以下错误,我不确定我实际做了哪些bash不喜欢的事情。test.sh:line16:group

python - Bash:按字节区分大小写的排序命令或使用 python 排序命令对文本文件进行排序

文本文件使用排序-s(区分大小写)ActBadBagCardEastaboutacrossbackballcameracanvasdangerdarkearlyedge使用sort-f(不区分大小写)aboutacrossActbackBadBagballcameracanvasCarddangerdarkearlyEastedge以大写字母开头的单词在小写单词之间按字母顺序排序。我想要的是大写单词位于每个下一个字母的开头(按大写字母顺序排序):预期输出:ActaboutacrossBadBagbackballCardcameracanvasdangerdarkEastearlyedg

linux - Bash Shell 执行 While Loop 无限循环?

基本上这是我的代码:bay=$(prog-someflags)while[$bay="Anotherinstanceofthisprogramisrunning,pleaseexititfirst"]doecho"AwaitingAccesstoprogram"do.....我有一个程序,由于它与我的硬件交互的方式,一次只允许一个实例运行,当另一个实例正在运行时,它会弹出以下消息“该程序的另一个实例正在运行,请退出它首先”。我需要能够运行多个将使用同一个程序的脚本,所以我决定使用上面的代码。我的问题是,当我运行我的两个脚本时,一个将获得对程序的访问权限并按需要运行,但另一个将注意到错误

linux - 执行 if...then...fi 时出现 Cygwin 错误 - Bash 脚本

我刚开始bashshell编程。我在我的Windows7计算机上安装了Cygwin。我开始使用thistutorial编写脚本.我的脚本需要一个参数传递给它,如果没有,它应该显示一条错误消息。这是直接来自教程的代码和我的代码中的相同代码:[$#-eq0]&&{echo"usage:someArgument";exit1;}当我执行以下操作时:sh./myscript.sh它给我这个错误:-bash:/home/Me/myscript.sh:line5:syntaxerror:unexpectedendoffile“意外的文件结束”意味着我在某处错过了fi或done等。我仔细检查了我的代

linux - Bash脚本被杀死时如何杀死当前命令

我目前有一个看起来像这样的脚本。#codemplayer"$vid"#morecode问题是,如果这个脚本被杀死,mplayer进程仍然存在。我想知道我怎样才能做到杀死脚本也会杀死mplayer。我不能使用exec因为我需要在mplayer之后运行命令。execmplayer"$vid"我能想到的唯一可能的解决方案是在后台生成它并等待它手动完成。这样我就可以获得它的PID并在脚本被杀死时将其杀死,这并不十分优雅。我想知道执行此操作的“正确”或最佳方法是什么。 最佳答案 我能够测试我在评论中发布的prctl想法,它似乎有效。你需要编译

linux - Bash:如何为 ssh 命令实时过滤 tee 输出?

我的目标是为我的sshsession中使用的命令制作一个带时间戳的日志。只要输出没有被过滤,Tee就会实时工作。当我tail-Ftest.log时,以下命令实时附加输出:#!/bin/bashssh"$@"|tee-atest.log但是,当我尝试通过thisquestion中建议的方法修改tee的输出时,输出不再是实时的。例如:#!/bin/bashssh"$@"|tee>(grep-e'.*\@.*\:.*\$.*'--color=never>>test.log)奇怪的是,如果我用“yes”命令代替ssh命令,输出会被实时正确过滤。实时处理很重要,因为我的脚本需要将当前时间戳附加到

linux - 用 '~' 替换主文件夹路径的 bash 当前工作目录

有没有办法用~替换主目录来回显当前目录?例子:~/inbox而不是/home/john/inbox不应对主目录进行硬编码。有$PWD和$HOME变量。一个内置的bash工具会很好。 最佳答案 echo"${PWD/#$HOME/\~}"这会将$HOME替换为~。#类似于正则表达式中的^:它将匹配锚定到字符串的开头。\~将$HOME替换为波浪号;如果我们不使用\转义符,~将重新扩展为$HOME并且实际上什么都不做。 关于linux-用'~'替换主文件夹路径的bash当前工作目录,我们在St

linux - 在 bash 别名中转义字符

这个问题在这里已经有了答案:bashaliascommandwithbothsingleanddoublequotes(4个答案)关闭2年前。这是别名:#makeatmuxsessioninworkingdirwiththenameofthediraliasth='tmuxnew-s$(pwd|tr'\/''\n'|tail-n1)'由于转义字符或别名内的',单引号,它不起作用。打印出来$type--allththisaliasedto`tmuxnew-s$(pwd|tr/n|tail-n1)'看起来它只是剥离了'和\。我最终通过将单引号更改为双引号来修复它。#makeatmuxses

linux - bash 脚本中的 '(( 10#$H > 5 ))' 是什么意思?

我对以下代码片段感到困惑:#!/bin/bashH=$(date+%H);if((10#$H>5))then#dosomethingelse#dosomethingelsefi上面代码片段中的((10#$H>5))是什么意思? 最佳答案 10#$H表示以10为基数展开数字。这可能是为了从日期中删除任何前导零,因为bash将解释基数8(八进制)中的数字。例子:$echo"$((08ARITHMETICEVALUATION:Constantswithaleading0areinterpretedasoctalnumbers.Aleadi